updated externals
authorHans Breuer <hans@breuer.org>
Sun, 19 Aug 2001 18:34:59 +0000 (18:34 +0000)
committerHans Breuer <hans@src.gnome.org>
Sun, 19 Aug 2001 18:34:59 +0000 (18:34 +0000)
2001-08-18  Hans Breuer  <hans@breuer.org>

* gdk/gdk.def : updated externals

* gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
is required to get (at least) visible in entry fields. Some selections
are really handled now - even on win32 - but copying via middle
mouse button into a different app needs to wait ...

* gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!

* gdk/win32/gdkevents-win32.c : some tweaking to get better expose
handling. I'm not sure if it is better now, but at least not worse

* gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
with SetWindowPos () which allows more fine-tuning backing-store wise

* gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
Also changed move/resize to be more like the X version.

* gtk/gtk.def : updated externals

14 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/gdk.def
gdk/win32/gdkdnd-win32.c
gdk/win32/gdkevents-win32.c
gdk/win32/gdkgeometry-win32.c
gdk/win32/gdkselection-win32.c
gdk/win32/gdkwindow-win32.c
gtk/gtk.def

index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index bfbdb0659c734a25c977d0d61038fcaf9974a5c2..a9a3b29d328dd1de071799ed540f260cbcfdef4d 100644 (file)
@@ -1,3 +1,26 @@
+2001-08-18  Hans Breuer  <hans@breuer.org>
+
+       * gdk/gdk.def : updated externals
+
+       * gdk/win32/gdkselection-win32.c : returning TRUE with gdk_selection_set
+       is required to get (at least) visible in entry fields. Some selections
+       are really handled now - even on win32 - but copying via middle
+       mouse button into a different app needs to wait ... 
+
+       * gdk/win32/gdkdnd-win32.c : implemented inter-app drag&drop
+       mostly by stealling code from gdkdnd-fb.c. Thanks to who ever wrote it!
+
+       * gdk/win32/gdkevents-win32.c : some tweaking to get better expose
+       handling. I'm not sure if it is better now, but at least not worse
+
+       * gdk/win32/gdkgeometry-win32.c : replaced every call to MoveWindow
+       with SetWindowPos () which allows more fine-tuning backing-store wise
+
+       * gdk/win32/gdkwindow-win32.c : allow unraised gdk_window_show ().
+       Also changed move/resize to be more like the X version.
+
+       * gtk/gtk.def : updated externals
+
 2001-08-19  Sven Neumann  <sven@gimp.org>
 
        * gtk/gtktooltips.c
index 2e72b8a21444741e4ef5de852d3107480b39fe42..f687d6b9f0f635dfd3c87f5e5f917175db3fa372 100644 (file)
@@ -1,8 +1,10 @@
 EXPORTS
        gdk_atom_intern
        gdk_atom_name
+       gdk_axis_use_get_type
        gdk_beep
        gdk_bitmap_create_from_data
+       gdk_byte_order_get_type
        gdk_cap_style_get_type
        gdk_char_height
        gdk_char_measure
@@ -34,6 +36,7 @@ EXPORTS
        gdk_colors_free
        gdk_colors_store
        gdk_core_pointer
+       gdk_crossing_mode_get_type
        gdk_cursor_new
        gdk_cursor_new_from_pixmap
        gdk_cursor_ref
@@ -124,11 +127,14 @@ EXPORTS
        gdk_event_queue_remove_link
        gdk_event_send_client_message
        gdk_event_send_clientmessage_toall
+       gdk_event_type_get_type
        gdk_event_unqueue
        gdk_events_pending
        gdk_exit
        gdk_extension_mode_get_type
        gdk_fill_get_type
+       gdk_fill_rule_get_type
+       gdk_filter_return_get_type
        gdk_flush
        gdk_font_equal
        gdk_font_from_description
@@ -138,6 +144,7 @@ EXPORTS
        gdk_font_id
        gdk_font_load
        gdk_font_ref
+       gdk_font_type_get_type
        gdk_font_unref
        gdk_fontset_load
        gdk_free_compound_text
@@ -173,6 +180,7 @@ EXPORTS
        gdk_get_display
        gdk_get_show_events
        gdk_get_use_xshm
+       gdk_grab_status_get_type
        gdk_gravity_get_type
        gdk_image_get
        gdk_image_get_pixel
@@ -190,9 +198,11 @@ EXPORTS
        gdk_input_condition_get_type
        gdk_input_exit
        gdk_input_init
+       gdk_input_mode_get_type
        gdk_input_motion_events
        gdk_input_remove
        gdk_input_set_extension_events
+       gdk_input_source_get_type
        gdk_join_style_get_type
        gdk_key_repeat_disable
        gdk_key_repeat_restore
@@ -217,7 +227,9 @@ EXPORTS
        gdk_list_visuals
        gdk_mbstowcs
        gdk_modifier_type_get_type
+       gdk_notify_type_get_type
        gdk_null_window_warnings
+       gdk_overlap_type_get_type
        gdk_pango_attr_embossed_new
        gdk_pango_attr_stipple_new
        gdk_pango_context_get
@@ -245,6 +257,7 @@ EXPORTS
        gdk_property_change
        gdk_property_delete
        gdk_property_get
+       gdk_property_state_get_type
        gdk_query_depths
        gdk_query_visual_types
        gdk_rectangle_get_type
@@ -284,7 +297,9 @@ EXPORTS
        gdk_screen_height_mm
        gdk_screen_width
        gdk_screen_width_mm
+       gdk_scroll_direction_get_type
        gdk_selection_convert
+       gdk_selection_get_type
        gdk_selection_owner_get
        gdk_selection_owner_set
        gdk_selection_property
@@ -295,7 +310,9 @@ EXPORTS
        gdk_set_show_events
        gdk_set_sm_client_id
        gdk_set_use_xshm
+       gdk_setting_action_get_type
        gdk_setting_get
+       gdk_status_get_type
        gdk_string_extents
        gdk_string_height
        gdk_string_measure
@@ -303,6 +320,7 @@ EXPORTS
        gdk_string_width
        gdk_subwindow_mode_get_type
        gdk_synthesize_window_state
+       gdk_target_get_type
        gdk_text_extents
        gdk_text_extents_wc
        gdk_text_height
@@ -317,6 +335,7 @@ EXPORTS
        gdk_unicode_to_keyval
        gdk_utf8_to_compound_text
        gdk_utf8_to_string_target
+       gdk_visibility_state_get_type
        gdk_visual_get_best
        gdk_visual_get_best_depth
        gdk_visual_get_best_type
@@ -332,10 +351,12 @@ EXPORTS
        gdk_win32_hdc_release
        gdk_window_add_filter
        gdk_window_at_pointer
+       gdk_window_attributes_type_get_type
        gdk_window_begin_move_drag
        gdk_window_begin_paint_rect
        gdk_window_begin_paint_region
        gdk_window_begin_resize_drag
+       gdk_window_class_get_type
        gdk_window_clear
        gdk_window_clear_area
        gdk_window_clear_area_e
@@ -343,6 +364,7 @@ EXPORTS
        gdk_window_deiconify
        gdk_window_destroy
        gdk_window_destroy_notify
+       gdk_window_edge_get_type
        gdk_window_end_paint
        gdk_window_focus
        gdk_window_foreign_new
@@ -362,6 +384,7 @@ EXPORTS
        gdk_window_get_user_data
        gdk_window_get_window_type
        gdk_window_hide
+       gdk_window_hints_get_type
        gdk_window_iconify
        gdk_window_invalidate_rect
        gdk_window_invalidate_region
@@ -407,8 +430,10 @@ EXPORTS
        gdk_window_shape_combine_mask
        gdk_window_shape_combine_region
        gdk_window_show
+       gdk_window_state_get_type
        gdk_window_stick
        gdk_window_thaw_updates
+       gdk_window_type_get_type
        gdk_window_type_hint_get_type
        gdk_window_unmaximize
        gdk_window_unstick
index fa2c9fabf8ee3d1368d32e7ae1e28bd7af1afb78..a5ed72b802ff0228d05c470605e0139872f89af9 100644 (file)
@@ -89,15 +89,16 @@ static int nformats;
  * this is used on both source and destination sides.
  */
 struct _GdkDragContextPrivateWin32 {
-  gint ref_count;
+  GdkAtom local_selection;
+  gint    ref_count;
 
   guint16 last_x;              /* Coordinates from last event */
   guint16 last_y;
-  HWND  dest_xid;
-  guint drag_status;           /* Current status of drag */
+  HWND    dest_xid;
+  guint   drag_status;         /* Current status of drag */
 };
 
-#define PRIVATE_DATA(context) ((GdkDragContextPrivateWin32 *) GDK_DRAG_CONTEXT (context)->windowing_data)
+#define GDK_DRAG_CONTEXT_PRIVATE_DATA(context) ((GdkDragContextPrivateWin32 *) GDK_DRAG_CONTEXT (context)->windowing_data)
 
 GdkDragContext *current_dest_drag = NULL;
 
@@ -161,7 +162,7 @@ static void
 gdk_drag_context_finalize (GObject *object)
 {
   GdkDragContext *context = GDK_DRAG_CONTEXT (object);
-  GdkDragContextPrivateWin32 *private = PRIVATE_DATA (context);
+  GdkDragContextPrivateWin32 *private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
   
   g_list_free (context->targets);
 
@@ -204,34 +205,32 @@ gdk_drag_context_unref (GdkDragContext *context)
   g_object_unref (G_OBJECT (context));
 }
 
-#if 0
-
 static GdkDragContext *
-gdk_drag_context_find (gboolean is_source,
-                      HWND     source_xid,
-                      HWND     dest_xid)
+gdk_drag_context_find (gboolean     is_source,
+                      GdkWindow   *source,
+                      GdkWindow   *dest)
 {
   GList *tmp_list = contexts;
+  
   GdkDragContext *context;
+  GdkDragContextPrivateWin32 *private;
 
   while (tmp_list)
     {
       context = (GdkDragContext *)tmp_list->data;
+      private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
 
       if ((!context->is_source == !is_source) &&
-         ((source_xid == None) || (context->source_window &&
-           (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) &&
-         ((dest_xid == None) || (context->dest_window &&
-           (GDK_WINDOW_XWINDOW (context->dest_window) == dest_xid))))
-       return context;
+         ((source == NULL) || (context->source_window && (context->source_window == source))) &&
+         ((dest == NULL) || (context->dest_window && (context->dest_window == dest))))
+         return context;
       
       tmp_list = tmp_list->next;
     }
-
+  
   return NULL;
 }
 
-#endif
 
 typedef struct {
 #ifdef OLE2_DND
@@ -266,7 +265,7 @@ static ULONG STDMETHODCALLTYPE
 idroptarget_addref (LPDROPTARGET This)
 {
   target_drag_context *ctx = (target_drag_context *) This;
-  GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
+  GdkDragContextPrivateWin32 *private = GDK_DRAG_CONTEXT_PRIVATE_DATA (ctx->context);
   int ref_count = ++private->ref_count;
 
   gdk_drag_context_ref (ctx->context);
@@ -311,7 +310,7 @@ static ULONG STDMETHODCALLTYPE
 idroptarget_release (LPDROPTARGET This)
 {
   target_drag_context *ctx = (target_drag_context *) This;
-  GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
+  GdkDragContextPrivateWin32 *private = GDK_DRAG_CONTEXT_PRIVATE_DATA (ctx->context);
   int ref_count = --private->ref_count;
 
   gdk_drag_context_unref (ctx->context);
@@ -370,7 +369,7 @@ static ULONG STDMETHODCALLTYPE
 idropsource_addref (LPDROPSOURCE This)
 {
   source_drag_context *ctx = (source_drag_context *) This;
-  GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
+  GdkDragContextPrivateWin32 *private = GDK_DRAG_CONTEXT_PRIVATE_DATA (ctx->context);
 
   gdk_drag_context_ref (ctx->context);
   GDK_NOTE (DND, g_print ("idropsource_addref %#x %d\n",
@@ -414,7 +413,7 @@ static ULONG STDMETHODCALLTYPE
 idropsource_release (LPDROPSOURCE This)
 {
   source_drag_context *ctx = (source_drag_context *) This;
-  GdkDragContextPrivateWin32 *private = PRIVATE_DATA (ctx->context);
+  GdkDragContextPrivateWin32 *private = GDK_DRAG_CONTEXT_PRIVATE_DATA (ctx->context);
   int ref_count = --private->ref_count;
 
   gdk_drag_context_unref (ctx->context);
@@ -962,10 +961,11 @@ gdk_dropfiles_filter (GdkXEvent *xev,
       GDK_NOTE (DND, g_print ("WM_DROPFILES: %#x\n", (guint) msg->hwnd));
 
       context = gdk_drag_context_new ();
-      private = PRIVATE_DATA (context);
+      private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
       context->protocol = GDK_DRAG_PROTO_WIN32_DROPFILES;
       context->is_source = FALSE;
       context->source_window = gdk_parent_root;
+      gdk_drawable_ref (context->source_window);
       context->dest_window = event->any.window;
       gdk_drawable_ref (context->dest_window);
       /* WM_DROPFILES drops are always file names */
@@ -1059,6 +1059,147 @@ gdk_win32_dnd_exit (void)
 
 /* Source side */
 
+static void
+local_send_leave (GdkDragContext  *context,
+                 guint32          time)
+{
+  GdkEvent tmp_event;
+  
+  if ((current_dest_drag != NULL) &&
+      (current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
+      (current_dest_drag->source_window == context->source_window))
+    {
+      tmp_event.dnd.type = GDK_DRAG_LEAVE;
+      tmp_event.dnd.window = context->dest_window;
+      /* Pass ownership of context to the event */
+      tmp_event.dnd.context = current_dest_drag;
+      tmp_event.dnd.send_event = FALSE;
+      tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+
+      current_dest_drag = NULL;
+      
+      gdk_event_put (&tmp_event);
+    }
+  
+}
+
+static void
+local_send_enter (GdkDragContext  *context,
+                 guint32          time)
+{
+  GdkEvent tmp_event;
+  GdkDragContextPrivateWin32 *private;
+  GdkDragContext *new_context;
+
+  private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
+  
+  if (!private->local_selection)
+    private->local_selection = gdk_atom_intern ("LocalDndSelection", FALSE);
+
+  if (current_dest_drag != NULL)
+    {
+      gdk_drag_context_unref (current_dest_drag);
+      current_dest_drag = NULL;
+    }
+
+  new_context = gdk_drag_context_new ();
+  new_context->protocol = GDK_DRAG_PROTO_LOCAL;
+  new_context->is_source = FALSE;
+
+  new_context->source_window = context->source_window;
+  gdk_window_ref (new_context->source_window);
+  new_context->dest_window = context->dest_window;
+  gdk_window_ref (new_context->dest_window);
+
+
+  new_context->targets = g_list_copy (context->targets);
+
+  gdk_window_set_events (new_context->source_window,
+                        gdk_window_get_events (new_context->source_window) |
+                        GDK_PROPERTY_CHANGE_MASK);
+  new_context->actions = context->actions;
+
+  tmp_event.dnd.type = GDK_DRAG_ENTER;
+  tmp_event.dnd.window = context->dest_window;
+  tmp_event.dnd.send_event = FALSE;
+  tmp_event.dnd.context = new_context;
+  gdk_drag_context_ref (new_context);
+
+  tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+  
+  current_dest_drag = new_context;
+  
+  (GDK_DRAG_CONTEXT_PRIVATE_DATA (new_context))->local_selection = 
+    private->local_selection;
+
+  gdk_event_put (&tmp_event);
+}
+
+static void
+local_send_motion (GdkDragContext  *context,
+                   gint            x_root, 
+                   gint            y_root,
+                   GdkDragAction   action,
+                   guint32         time)
+{
+  GdkEvent tmp_event;
+  
+  if ((current_dest_drag != NULL) &&
+      (current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
+      (current_dest_drag->source_window == context->source_window))
+    {
+      tmp_event.dnd.type = GDK_DRAG_MOTION;
+      tmp_event.dnd.window = current_dest_drag->dest_window;
+      tmp_event.dnd.send_event = FALSE;
+      tmp_event.dnd.context = current_dest_drag;
+      gdk_drag_context_ref (current_dest_drag);
+
+      tmp_event.dnd.time = time;
+
+      current_dest_drag->suggested_action = action;
+      current_dest_drag->actions = current_dest_drag->suggested_action;
+
+      tmp_event.dnd.x_root = x_root;
+      tmp_event.dnd.y_root = y_root;
+
+      (GDK_DRAG_CONTEXT_PRIVATE_DATA (current_dest_drag))->last_x = x_root;
+      (GDK_DRAG_CONTEXT_PRIVATE_DATA (current_dest_drag))->last_y = y_root;
+
+      GDK_DRAG_CONTEXT_PRIVATE_DATA (context)->drag_status = GDK_DRAG_STATUS_MOTION_WAIT;
+      
+      gdk_event_put (&tmp_event);
+    }
+}
+
+static void
+local_send_drop (GdkDragContext *context, guint32 time)
+{
+  GdkEvent tmp_event;
+  
+  if ((current_dest_drag != NULL) &&
+      (current_dest_drag->protocol == GDK_DRAG_PROTO_LOCAL) &&
+      (current_dest_drag->source_window == context->source_window))
+    {
+      GdkDragContextPrivateWin32 *private;
+      private = GDK_DRAG_CONTEXT_PRIVATE_DATA (current_dest_drag);
+
+      tmp_event.dnd.type = GDK_DROP_START;
+      tmp_event.dnd.window = current_dest_drag->dest_window;
+      tmp_event.dnd.send_event = FALSE;
+
+      tmp_event.dnd.context = current_dest_drag;
+      gdk_drag_context_ref (current_dest_drag);
+
+      tmp_event.dnd.time = GDK_CURRENT_TIME;
+      
+      tmp_event.dnd.x_root = private->last_x;
+      tmp_event.dnd.y_root = private->last_y;
+      
+      gdk_event_put (&tmp_event);
+    }
+
+}
+
 static void
 gdk_drag_do_leave (GdkDragContext *context,
                   guint32         time)
@@ -1066,6 +1207,16 @@ gdk_drag_do_leave (GdkDragContext *context,
   if (context->dest_window)
     {
       GDK_NOTE (DND, g_print ("gdk_drag_do_leave\n"));
+
+      switch (context->protocol)
+       {
+       case GDK_DRAG_PROTO_LOCAL:
+         local_send_leave (context, time);
+         break;
+       default:
+         break;
+       }
+
       gdk_drawable_unref (context->dest_window);
       context->dest_window = NULL;
     }
@@ -1075,8 +1226,31 @@ GdkDragContext *
 gdk_drag_begin (GdkWindow *window,
                GList     *targets)
 {
+#ifndef OLE2_DND
+  GList *tmp_list;
+  GdkDragContext *new_context;
+
+  g_return_val_if_fail (window != NULL, NULL);
+
+  new_context = gdk_drag_context_new ();
+  new_context->is_source = TRUE;
+  new_context->source_window = window;
+  gdk_window_ref (window);
+
+  tmp_list = g_list_last (targets);
+  new_context->targets = NULL;
+  while (tmp_list)
+    {
+      new_context->targets = g_list_prepend (new_context->targets,
+                                            tmp_list->data);
+      tmp_list = tmp_list->prev;
+    }
+
+  new_context->actions = 0;
+
+  return new_context;
+#else
   source_drag_context *ctx;
-#ifdef OLE2_DND
   GList *tmp_list;
   data_object *dobj;
   HRESULT hResult;
@@ -1084,7 +1258,6 @@ gdk_drag_begin (GdkWindow *window,
   HGLOBAL global;
   FORMATETC format;
   STGMEDIUM medium;
-#endif
 
   g_return_val_if_fail (window != NULL, NULL);
 
@@ -1095,7 +1268,6 @@ gdk_drag_begin (GdkWindow *window,
   ctx->context->source_window = window;
   gdk_drawable_ref (window);
 
-#ifdef OLE2_DND
   tmp_list = g_list_last (targets);
   ctx->context->targets = NULL;
   while (tmp_list)
@@ -1129,15 +1301,28 @@ gdk_drag_begin (GdkWindow *window,
 
   dobj->ido.lpVtbl->Release (&dobj->ido);
   ctx->ids.lpVtbl->Release (&ctx->ids);
-#endif
+
   return ctx->context;
+#endif
 }
 
 guint32
 gdk_drag_get_protocol (guint32          xid,
                       GdkDragProtocol *protocol)
 {
-  /* This isn't used */
+  GdkWindow *window;
+
+  GDK_NOTE (DND, g_print ("gdk_drag_get_protocol\n"));
+
+  window = gdk_window_lookup (xid);
+
+
+  if (GPOINTER_TO_INT (gdk_drawable_get_data (window, "gdk-dnd-registered")))
+    {
+      *protocol = GDK_DRAG_PROTO_LOCAL;
+      return xid;
+    }
+
   return 0;
 }
 
@@ -1152,10 +1337,6 @@ gdk_drag_find_window (GdkDragContext  *context,
   HWND recipient;
   POINT pt;
 
-  GDK_NOTE (DND, g_print ("gdk_drag_find_window: %#x +%d+%d\n",
-                         (drag_window ? (guint) GDK_WINDOW_HWND (drag_window) : 0),
-                         x_root, y_root));
-
   pt.x = x_root;
   pt.y = y_root;
   recipient = WindowFromPoint (pt);
@@ -1166,8 +1347,17 @@ gdk_drag_find_window (GdkDragContext  *context,
       *dest_window = gdk_win32_handle_table_lookup (GPOINTER_TO_UINT(recipient));
       if (*dest_window)
        gdk_drawable_ref (*dest_window);
-      *protocol = GDK_DRAG_PROTO_WIN32_DROPFILES;
+
+      if (context->source_window)
+        *protocol = GDK_DRAG_PROTO_LOCAL;
+      else
+        *protocol = GDK_DRAG_PROTO_WIN32_DROPFILES;
     }
+
+  GDK_NOTE (DND, g_print ("gdk_drag_find_window: %#x +%d+%d Protocol: %d\n",
+                         (drag_window ? (guint) GDK_WINDOW_HWND (drag_window) : 0),
+                         x_root, y_root, *protocol));
+
 }
 
 gboolean
@@ -1180,8 +1370,94 @@ gdk_drag_motion (GdkDragContext *context,
                 GdkDragAction   possible_actions,
                 guint32         time)
 {
+  GdkDragContextPrivateWin32 *private;
+
+  g_return_val_if_fail (context != NULL, FALSE);
+
   GDK_NOTE (DND, g_print ("gdk_drag_motion\n"));
 
+  private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
+  
+  if (context->dest_window != dest_window)
+    {
+      GdkEvent temp_event;
+
+      /* Send a leave to the last destination */
+      gdk_drag_do_leave (context, time);
+      private->drag_status = GDK_DRAG_STATUS_DRAG;
+
+      /* Check if new destination accepts drags, and which protocol */
+      if (dest_window)
+       {
+         context->dest_window = dest_window;
+         gdk_window_ref (context->dest_window);
+         context->protocol = protocol;
+
+         switch (protocol)
+           {
+           case GDK_DRAG_PROTO_LOCAL:
+             local_send_enter (context, time);
+             break;
+
+
+           default:
+             break;
+           }
+         context->suggested_action = suggested_action;
+       }
+      else
+       {
+         context->dest_window = NULL;
+         context->action = 0;
+       }
+
+      /* Push a status event, to let the client know that
+       * the drag changed 
+       */
+
+      temp_event.dnd.type = GDK_DRAG_STATUS;
+      temp_event.dnd.window = context->source_window;
+      /* We use this to signal a synthetic status. Perhaps
+       * we should use an extra field...
+       */
+      temp_event.dnd.send_event = TRUE;
+
+      temp_event.dnd.context = context;
+      temp_event.dnd.time = time;
+
+      gdk_event_put (&temp_event);
+    }
+  else
+    {
+      context->suggested_action = suggested_action;
+    }
+
+  /* Send a drag-motion event */
+
+  private->last_x = x_root;
+  private->last_y = y_root;
+      
+  if (context->dest_window)
+    {
+      if (private->drag_status == GDK_DRAG_STATUS_DRAG)
+       {
+         switch (context->protocol)
+           {
+           case GDK_DRAG_PROTO_LOCAL:
+             local_send_motion (context, x_root, y_root, suggested_action, time);
+             break;
+             
+           case GDK_DRAG_PROTO_NONE:
+             g_warning ("GDK_DRAG_PROTO_NONE is not valid in gdk_drag_motion()");
+             break;
+           default:
+             break;
+           }
+       }
+      else
+       return TRUE;
+    }
+
   return FALSE;
 }
 
@@ -1192,6 +1468,22 @@ gdk_drag_drop (GdkDragContext *context,
   g_return_if_fail (context != NULL);
 
   GDK_NOTE (DND, g_print ("gdk_drag_drop\n"));
+
+  if (context->dest_window)
+    {
+      switch (context->protocol)
+       {
+       case GDK_DRAG_PROTO_LOCAL:
+         local_send_drop (context, time);
+         break;
+
+       case GDK_DRAG_PROTO_NONE:
+         g_warning ("GDK_DRAG_PROTO_NONE is not valid in gdk_drag_drop()");
+         break;
+       default:
+         break;
+       }
+    }
 }
 
 void
@@ -1212,7 +1504,40 @@ gdk_drag_status (GdkDragContext *context,
                 GdkDragAction   action,
                 guint32         time)
 {
-  GDK_NOTE (DND, g_print ("gdk_drag_status\n"));
+  GdkDragContextPrivateWin32 *private;
+  GdkDragContext *src_context;
+  GdkEvent tmp_event;
+
+  g_return_if_fail (context != NULL);
+
+  private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
+
+  src_context = gdk_drag_context_find (TRUE,
+                                      context->source_window,
+                                      context->dest_window);
+
+  if (src_context)
+    {
+      GdkDragContextPrivateWin32 *private = GDK_DRAG_CONTEXT_PRIVATE_DATA (src_context);
+      
+      if (private->drag_status == GDK_DRAG_STATUS_MOTION_WAIT)
+       private->drag_status = GDK_DRAG_STATUS_DRAG;
+
+      tmp_event.dnd.type = GDK_DRAG_STATUS;
+      tmp_event.dnd.window = context->source_window;
+      tmp_event.dnd.send_event = FALSE;
+      tmp_event.dnd.context = src_context;
+      gdk_drag_context_ref (src_context);
+
+      tmp_event.dnd.time = GDK_CURRENT_TIME; /* FIXME? */
+
+      if (action == GDK_ACTION_DEFAULT)
+       action = 0;
+      
+      src_context->action = action;
+      
+      gdk_event_put (&tmp_event);
+    }
 }
 
 void 
@@ -1220,6 +1545,8 @@ gdk_drop_reply (GdkDragContext *context,
                gboolean        ok,
                guint32         time)
 {
+  g_return_if_fail (context != NULL);
+
   GDK_NOTE (DND, g_print ("gdk_drop_reply\n"));
 }
 
@@ -1228,7 +1555,29 @@ gdk_drop_finish (GdkDragContext *context,
                 gboolean        success,
                 guint32         time)
 {
+  GdkDragContextPrivateWin32 *private;
+  GdkDragContext *src_context;
+  GdkEvent tmp_event;
+       
+  g_return_if_fail (context != NULL);
+
   GDK_NOTE (DND, g_print ("gdk_drop_finish\n"));
+
+  private = GDK_DRAG_CONTEXT_PRIVATE_DATA (context);
+
+  src_context = gdk_drag_context_find (TRUE,
+                                      context->source_window,
+                                      context->dest_window);
+  if (src_context)
+    {
+      tmp_event.dnd.type = GDK_DROP_FINISHED;
+      tmp_event.dnd.window = src_context->source_window;
+      tmp_event.dnd.send_event = FALSE;
+      tmp_event.dnd.context = src_context;
+      gdk_drag_context_ref (src_context);
+
+      gdk_event_put (&tmp_event);
+    }
 }
 
 #ifdef OLE2_DND
@@ -1265,6 +1614,11 @@ gdk_window_register_dnd (GdkWindow *window)
 
   g_return_if_fail (window != NULL);
 
+  if (GPOINTER_TO_INT (gdk_drawable_get_data (window, "gdk-dnd-registered")))
+    return;
+  else
+    gdk_drawable_set_data (window, "gdk-dnd-registered", GINT_TO_POINTER(TRUE), NULL);
+
   GDK_NOTE (DND, g_print ("gdk_window_register_dnd: %#x\n",
                          (guint) GDK_WINDOW_HWND (window)));
 
@@ -1315,7 +1669,9 @@ gdk_window_register_dnd (GdkWindow *window)
 GdkAtom
 gdk_drag_get_selection (GdkDragContext *context)
 {
-  if (context->protocol == GDK_DRAG_PROTO_WIN32_DROPFILES)
+  if (context->protocol == GDK_DRAG_PROTO_LOCAL)
+    return (GDK_DRAG_CONTEXT_PRIVATE_DATA (context))->local_selection;
+  else if (context->protocol == GDK_DRAG_PROTO_WIN32_DROPFILES)
     return gdk_win32_dropfiles_atom;
   else if (context->protocol == GDK_DRAG_PROTO_OLE2)
     return gdk_ole2_dnd_atom;
index d5199c906d0a5dec274546a99c265efb47340808..6b95b0a1fb0fa3bd0c3eb4d1f7d84b02b5a81459 100644 (file)
@@ -1680,6 +1680,7 @@ gdk_event_translate (GdkEvent *event,
       event->selection.type = GDK_SELECTION_CLEAR;
       event->selection.window = window;
       event->selection.selection = msg->wParam;
+      event->selection.target = msg->lParam;
       event->selection.time = msg->time;
 
       return_val = !GDK_WINDOW_DESTROYED (window);
@@ -2531,6 +2532,9 @@ gdk_event_translate (GdkEvent *event,
       if (GDK_WINDOW_DESTROYED (window))
        break;
 
+      *ret_val_flagp = TRUE; /* always claim as handled */
+      *ret_valp = 1;
+
       if (GDK_WINDOW_OBJECT (window)->input_only)
        break;
 
@@ -2560,8 +2564,6 @@ gdk_event_translate (GdkEvent *event,
                   colormap_private->xcolormap->palette, k);
 #endif
        }
-      *ret_val_flagp = TRUE;
-      *ret_valp = 1;
 
       if (GDK_WINDOW_OBJECT (window)->bg_pixmap == GDK_PARENT_RELATIVE_BG)
        {
@@ -2577,6 +2579,14 @@ gdk_event_translate (GdkEvent *event,
            }
        }
 
+      if (GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->position_info.no_bg)
+       {
+         /* improves scolling effect, e.g. main buttons of testgtk */
+         *ret_val_flagp = TRUE;
+         *ret_valp = 1;
+         break;
+       }
+
       if (GDK_WINDOW_OBJECT (window)->bg_pixmap == NULL)
        {
          bg = gdk_colormap_color (GDK_DRAWABLE_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->colormap,
@@ -2678,18 +2688,6 @@ gdk_event_translate (GdkEvent *event,
           break;
         }
 
-      /* HB: don't generate GDK_EXPOSE events for InputOnly
-       * windows -> backing store now works!
-       */
-      if (GDK_WINDOW_OBJECT (window)->input_only)
-       break;
-
-      if (!(window_impl->event_mask & GDK_EXPOSURE_MASK))
-       break;
-
-      if (GDK_WINDOW_OBJECT (window)->bg_pixmap == GDK_NO_BG)
-       break;
-
       hdc = BeginPaint (msg->hwnd, &paintstruct);
 
       GDK_NOTE (EVENTS,
@@ -2703,6 +2701,18 @@ gdk_event_translate (GdkEvent *event,
 
       EndPaint (msg->hwnd, &paintstruct);
 
+      /* HB: don't generate GDK_EXPOSE events for InputOnly
+       * windows -> backing store now works!
+       */
+      if (GDK_WINDOW_OBJECT (window)->input_only)
+       break;
+
+      if (!(window_impl->event_mask & GDK_EXPOSURE_MASK))
+       break;
+
+      if (GDK_WINDOW_OBJECT (window)->bg_pixmap == GDK_NO_BG)
+       break;
+
       if ((paintstruct.rcPaint.right == paintstruct.rcPaint.left)
           || (paintstruct.rcPaint.bottom == paintstruct.rcPaint.top))
         break;
@@ -2742,7 +2752,7 @@ gdk_event_translate (GdkEvent *event,
           expose_rect.width = paintstruct.rcPaint.right - paintstruct.rcPaint.left;
           expose_rect.height = paintstruct.rcPaint.bottom - paintstruct.rcPaint.top;
 
-           _gdk_window_process_expose (window, GetMessageTime (), &expose_rect);
+           _gdk_window_process_expose (window, msg->time, &expose_rect);
 
            return_val = FALSE;
         }
@@ -2868,9 +2878,11 @@ gdk_event_translate (GdkEvent *event,
        {
          mmi->ptMaxTrackSize.x = window_impl->hint_max_width;
          mmi->ptMaxTrackSize.y = window_impl->hint_max_height;
-           
-         mmi->ptMaxSize.x = window_impl->hint_max_width;
-         mmi->ptMaxSize.y = window_impl->hint_max_height;
+
+         /* kind of WM functionality, limit maximized size to screen */
+         mmi->ptMaxPosition.x = 0; mmi->ptMaxPosition.y = 0;       
+         mmi->ptMaxSize.x = MIN(window_impl->hint_max_width, gdk_screen_width ());
+         mmi->ptMaxSize.y = MIN(window_impl->hint_max_height, gdk_screen_height ());
        }
       break;
 
@@ -3097,6 +3109,8 @@ void
 gdk_events_queue (void)
 {
   MSG msg;
+  GdkEvent *event;
+  GList *node;
 
   while (!gdk_event_queue_find_first ()
         && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
@@ -3108,7 +3122,33 @@ gdk_events_queue (void)
          || (active_imm_msgpump_owner->lpVtbl->OnTranslateMessage) (active_imm_msgpump_owner, &msg) != S_OK)
        TranslateMessage (&msg);
 
+#if 1 /* It was like this all the time */
       DispatchMessage (&msg);
+#else /* but this one is more similar to the X implementation. Any effect ? */
+      event = gdk_event_new ();
+      
+      event->any.type = GDK_NOTHING;
+      event->any.window = NULL;
+      event->any.send_event = InSendMessage ();
+
+      ((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING;
+
+      gdk_event_queue_append (event);
+      node = gdk_queued_tail;
+
+      if (gdk_event_translate (event, &msg, NULL, NULL, FALSE))
+       {
+         ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING;
+       }
+      else
+       {
+         gdk_event_queue_remove_link (node);
+         g_list_free_1 (node);
+         gdk_event_free (event);
+        DispatchMessage (&msg);
+       }
+
+#endif
     }
 }
 
index d16ae5426aea50146ec2f3564e9245eec6aca2ae..373d6b596b546aa860bcdc4c82ac678b692d0534 100644 (file)
@@ -148,6 +148,10 @@ gdk_window_scroll (GdkWindow *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
 
+  /* Move the current invalid region */
+  if (obj->update_area)
+    gdk_region_offset (obj->update_area, dx, dy);
+
   /* We can guffaw scroll if we are a child window, and the parent
    * does not extend beyond our edges.
    */
@@ -163,6 +167,47 @@ gdk_window_scroll (GdkWindow *window,
 
   if (!obj->children || !can_guffaw_scroll)
     {
+#if 0 /* this may be the better way to do it, though there seems to 
+         be an offset error in it */
+      GList *tmp_list = obj->children;
+      int num_windows = g_list_length (tmp_list) + 1;
+      HDWP hWinPosInfo = BeginDeferWindowPos (num_windows);
+
+      GDK_NOTE (MISC, 
+                g_print ("gdk_window_scroll (%x, %d, %d), %d childs\n",
+                         GDK_WINDOW_HWND (window), dx, dy, num_windows -1));
+      if (!hWinPosInfo)
+        WIN32_API_FAILED ("BeginDeferWindowPos");
+      else
+        {
+
+          hWinPosInfo = 
+            DeferWindowPos (hWinPosInfo, /* may change on return */
+                            GDK_WINDOW_HWND (window),
+                            NULL, /* placement-order handle, ignored */
+                            obj->x + dx, obj->y + dy, /* new pos */
+                            30, 20,  /* new size, ignored */
+                            SWP_NOSIZE | SWP_NOZORDER);
+
+          while (tmp_list)
+           {
+             GdkWindowObject * child = GDK_WINDOW_OBJECT (tmp_list->data);
+         
+              hWinPosInfo = 
+                DeferWindowPos (hWinPosInfo, /* may change on return */
+                                GDK_WINDOW_HWND (child),
+                                NULL, /* placement-order handle, ignored */
+                                child->x + dx, child->y + dy, /* new pos */
+                                30, 20,  /* new size, ignored */
+                                SWP_NOSIZE | SWP_NOZORDER);
+         
+             tmp_list = tmp_list->next;
+           }
+
+          if (!EndDeferWindowPos (hWinPosInfo))
+           WIN32_API_FAILED ("EndDeferWindowPos");
+       }
+#else
       /* Use ScrollWindowEx, then move any children later
        */
       GList *tmp_list;
@@ -203,6 +248,7 @@ gdk_window_scroll (GdkWindow *window,
          
          tmp_list = tmp_list->next;
        }
+#endif
     }
   else
     {
@@ -295,10 +341,10 @@ _gdk_window_move_resize_child (GdkWindow *window,
          new_y1 = impl->position_info.y + new_info.height + d_yoffset;
        }
       
-      if (!MoveWindow (GDK_WINDOW_HWND (window),
+      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
                       new_x0, new_y0, new_x1 - new_x0, new_y1 - new_y0,
-                      FALSE))
-         WIN32_API_FAILED ("MoveWindow");
+                      SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW))
+         WIN32_API_FAILED ("SetWindowPos");
       
       tmp_list = obj->children;
       while (tmp_list)
@@ -307,21 +353,25 @@ _gdk_window_move_resize_child (GdkWindow *window,
          tmp_list = tmp_list->next;
        }
 
-      GetClientRect (GDK_WINDOW_HWND (window), &rect);
-
-      if (!MoveWindow (GDK_WINDOW_HWND (window),
-                      new_x0 + dx, new_y0 + dy,
-                      rect.right - rect.left, rect.bottom - rect.top,
-                      FALSE))
-         WIN32_API_FAILED ("MoveWindow");
+      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
+                      new_x0 + dx, new_y0 + dy, 0, 0,
+                      SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOREDRAW))
+         WIN32_API_FAILED ("SetWindowPos");
       
       if (d_xoffset > 0 || d_yoffset > 0)
        gdk_window_queue_translation (window, MAX (d_xoffset, 0), MAX (d_yoffset, 0));
       
-      if (!MoveWindow (GDK_WINDOW_HWND (window),
+      /* FIXME: 
+       */
+      if (new_info.x + new_info.width > 32767)
+        new_info.width = 32767 - new_info.x;
+      if (new_info.y + new_info.height > 32767)
+        new_info.height = 32767 - new_info.y;
+
+      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
                       new_info.x, new_info.y, new_info.width, new_info.height,
-                      FALSE))
-         WIN32_API_FAILED ("MoveWindow");
+                      SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW))
+         WIN32_API_FAILED ("SetWindowPos");
       
       if (impl->position_info.no_bg)
        gdk_window_tmp_reset_bg (window);
@@ -353,28 +403,11 @@ _gdk_window_move_resize_child (GdkWindow *window,
          tmp_list = tmp_list->next;
        }
 
-      /*
-       * HB: Passing TRUE(=Redraw) to MoveWindow here fixes some
-       * redraw problems with (e.g. testgtk main buttons)
-       * scrolling. AFAIK the non flicker optimization would
-       * be done by the GDI anyway, if the window is SW_HIDE.
-       */
-      if (is_resize)
-       {
-         if (!MoveWindow (GDK_WINDOW_HWND (window),
+      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
                           new_info.x, new_info.y, new_info.width, new_info.height,
-                          TRUE /*FALSE*/))
-           WIN32_API_FAILED ("MoveWindow");
-       }
-      else
-       {
-         GetClientRect (GDK_WINDOW_HWND (window), &rect);
-         if (!MoveWindow (GDK_WINDOW_HWND (window),
-                          new_info.x, new_info.y,
-                          rect.right - rect.left, rect.bottom - rect.top,
-                          TRUE /*FALSE*/))
-           WIN32_API_FAILED ("MoveWindow");
-       }
+                          SWP_NOACTIVATE | SWP_NOZORDER |
+                          (is_resize ? 0 : SWP_NOSIZE)))
+         WIN32_API_FAILED ("SetWindowPos");
 
       tmp_list = obj->children;
       while (tmp_list)
@@ -610,10 +643,10 @@ gdk_window_premove (GdkWindow          *window,
          new_y1 = impl->position_info.y + new_info.height + d_yoffset;
        }
 
-      if (!MoveWindow (GDK_WINDOW_HWND (window),
+      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
                       new_x0, new_y0, new_x1 - new_x0, new_y1 - new_y0,
-                      FALSE))
-       WIN32_API_FAILED ("MoveWindow");
+                      SWP_NOREDRAW | SWP_NOZORDER | SWP_NOACTIVATE))
+       WIN32_API_FAILED ("SetWindowPos");
     }
 
   tmp_list = obj->children;
@@ -654,10 +687,10 @@ gdk_window_postmove (GdkWindow          *window,
       if (d_xoffset > 0 || d_yoffset > 0)
        gdk_window_queue_translation (window, MAX (d_xoffset, 0), MAX (d_yoffset, 0));
        
-      if (!MoveWindow (GDK_WINDOW_HWND (window),
+      if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
                       new_info.x, new_info.y, new_info.width, new_info.height,
-                      FALSE))
-       WIN32_API_FAILED ("MoveWindow");
+                      SWP_NOREDRAW | SWP_NOZORDER | SWP_NOACTIVATE))
+       WIN32_API_FAILED ("SetWindowPos");
     }
 
   if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))
@@ -701,7 +734,7 @@ gboolean
 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
                                        GdkRegion *area)
 {
-#if 0
+#if 1
   GdkWindowQueueItem *item = g_new (GdkWindowQueueItem, 1);
 
   item->window = window;
index bf5733c8b86ae52508e359d7254684f21025658b..fd85b80322835fa59b262a2a9114d55b45284e0b 100644 (file)
@@ -95,7 +95,12 @@ gdk_selection_owner_set (GdkWindow *owner,
             g_free (sel_name)));
 
   if (selection != gdk_clipboard_atom)
-    return FALSE;
+    {
+      if (!owner)
+        return FALSE;
+      gdk_sel_prop_store (owner, selection, 0, 0, 0);
+      return TRUE;
+    }
 
   if (owner != NULL)
     {
@@ -143,23 +148,52 @@ gdk_selection_owner_set (GdkWindow *owner,
   return TRUE;
 }
 
+/* callback for g_hash_table_for_each */
+typedef struct {
+  GdkAtom         atom;
+  GdkNativeWindow hwnd;
+} SelectionAndHwnd;
+
+static void
+window_from_selection (gpointer key,
+                 gpointer value,
+                 gpointer user_data)
+{
+  GdkSelProp *selprop = (GdkSelProp *)value;  
+  SelectionAndHwnd *sah = (SelectionAndHwnd *) user_data;
+
+  if (selprop->type == sah->atom)
+    sah->hwnd = *(GdkNativeWindow*) key;
+}
+
 GdkWindow*
 gdk_selection_owner_get (GdkAtom selection)
 {
   GdkWindow *window;
   gchar *sel_name;
 
-#if 1
+#if 0
   /* XXX Hmm, gtk selections seem to work best with this. This causes
    * gtk to always get the clipboard contents from Windows, and not
    * from the editable's own stashed-away copy.
    */
   return NULL;
 #else
+  /* HB: The above is no longer true with recent changes to get
+   * inter-app drag&drop working ...
+   */
   if (selection != gdk_clipboard_atom)
-    window = NULL;
+    {
+      SelectionAndHwnd sah;
+      sah.atom = selection;
+      sah.hwnd = 0;
+      g_hash_table_foreach (sel_prop_table, window_from_selection, &sah);
+
+      window = gdk_win32_handle_table_lookup (sah.hwnd);
+    }
   else
-    window = gdk_win32_handle_table_lookup (GetClipboardOwner ());
+    window = gdk_win32_handle_table_lookup ((GdkNativeWindow) GetClipboardOwner ());
 
 #endif
 
@@ -372,7 +406,10 @@ gdk_selection_send_notify (guint32  requestor,
    * always return NULL, it works. Sigh.
    */
 
-  SendMessage ((HWND) requestor, gdk_selection_clear_msg, selection, 0);
+  SendMessage ((HWND) requestor, 
+               gdk_selection_clear_msg, 
+               selection, 
+               target);
 }
 
 gint
index 1d6e7deeb408112743a1d2d559ab3ba91df1d2b0..75ce99dc9e2a36a4985991bf754d42d2d9ae3074 100644 (file)
@@ -805,14 +805,14 @@ gdk_window_destroy_notify (GdkWindow *window)
   gdk_drawable_unref (window);
 }
 
-void
-gdk_window_show (GdkWindow *window)
+static void
+show_window_internal (GdkWindow *window,
+                      gboolean   raise)
 {
   GdkWindowObject *private;
   
-  g_return_if_fail (GDK_IS_WINDOW (window));
-  
-  private = (GdkWindowObject*) window;
+  private = GDK_WINDOW_OBJECT (window);
+
   if (!private->destroyed)
     {
       GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
@@ -852,7 +852,8 @@ gdk_window_show (GdkWindow *window)
                }
               if (parent == gdk_parent_root)
                 SetForegroundWindow (GDK_WINDOW_HWND (window));
-             BringWindowToTop (GDK_WINDOW_HWND (window));
+             if (raise)
+               BringWindowToTop (GDK_WINDOW_HWND (window));
 #if 0
              ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
 #endif
@@ -861,6 +862,22 @@ gdk_window_show (GdkWindow *window)
     }
 }
 
+void
+gdk_window_show_unraised (GdkWindow *window)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  
+  show_window_internal (window, FALSE);
+}
+
+void
+gdk_window_show (GdkWindow *window)
+{
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  show_window_internal (window, TRUE);
+}
+
 void
 gdk_window_hide (GdkWindow *window)
 {
@@ -920,7 +937,19 @@ gdk_window_move (GdkWindow *window,
 
   impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
   
-  gdk_window_move_resize (window, x, y, impl->width, impl->height);
+  if (!GDK_WINDOW_DESTROYED (window))
+    {
+      if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
+       _gdk_window_move_resize_child (window, x, y,
+                                      impl->width, impl->height);
+      else
+       {
+         if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
+                            x, y, impl->width, impl->height,
+                            SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER))
+           WIN32_API_FAILED ("SetWindowPos");
+       }
+    }
 }
 
 void
@@ -942,13 +971,12 @@ gdk_window_resize (GdkWindow *window,
 
   impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
   
-  if (!private->destroyed)
+  if (!GDK_WINDOW_DESTROYED (window))
     {
-      GDK_NOTE (MISC, g_print ("gdk_window_resize: %#x %dx%d\n",
-                              (guint) GDK_WINDOW_HWND (window),
-                              width, height));
-      
-      if (GDK_WINDOW_TYPE (private) != GDK_WINDOW_CHILD)
+      if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
+       _gdk_window_move_resize_child (window, private->x, private->y,
+                                      width, height);
+      else
        {
          POINT pt;
          RECT rect;
@@ -972,22 +1000,12 @@ gdk_window_resize (GdkWindow *window,
          y = rect.top;
          width = rect.right - rect.left;
          height = rect.bottom - rect.top;
+         if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
+                            x, y, width, height,
+                            SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER))
+           WIN32_API_FAILED ("SetWindowPos");
        }
-      else
-       {
-         x = private->x;
-         y = private->y;
-         impl->width = width;
-         impl->height = height;
-       }
-
       private->resize_count += 1;
-
-      GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
-                              (guint) GDK_WINDOW_HWND (window),
-                              width, height, x, y));
-      if (!MoveWindow (GDK_WINDOW_HWND (window), x, y, width, height, TRUE))
-       WIN32_API_FAILED ("MoveWindow");
     }
 }
 
@@ -1035,15 +1053,15 @@ gdk_window_move_resize (GdkWindow *window,
          if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
            WIN32_API_FAILED ("AdjustWindowRectEx");
 
-         GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%ldx%ld@+%ld+%ld)\n",
+         GDK_NOTE (MISC, g_print ("...SetWindowPos(%#x,%ldx%ld@+%ld+%ld)\n",
                                   (guint) GDK_WINDOW_HWND (window),
                                   rect.right - rect.left, rect.bottom - rect.top,
                                   rect.left, rect.top));
-         if (!MoveWindow (GDK_WINDOW_HWND (window),
-                          rect.left, rect.top,
-                          rect.right - rect.left, rect.bottom - rect.top,
-                          TRUE))
-           WIN32_API_FAILED ("MoveWindow");
+         if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
+                            rect.left, rect.top,
+                            rect.right - rect.left, rect.bottom - rect.top,
+                            SWP_NOACTIVATE | SWP_NOZORDER))
+           WIN32_API_FAILED ("SetWindowPos");
        }
     }
 }
@@ -1509,6 +1527,10 @@ gdk_window_set_transient_for (GdkWindow *window,
 #if 0 /* not sure if we want to do this, clipping to parent size! */
   if (!SetParent (window_id, parent_id))
        WIN32_API_FAILED ("SetParent");
+#else /* make the modal window topmost instead */
+  if (!SetWindowPos (window_id, HWND_TOPMOST, 0, 0, 0, 0,
+                     SWP_NOMOVE | SWP_NOSIZE))
+    WIN32_API_FAILED ("SetWindowPos");
 #endif
 
   if (!RedrawWindow (window_id, NULL, NULL, 
index 5595913f9686333b29dbe39d8a0d7eb18259d081..fa580dacd144aef4fbae12b13ef1193c40ac965d 100755 (executable)
@@ -618,6 +618,7 @@ EXPORTS
        gtk_hscrollbar_new
        gtk_hseparator_get_type
        gtk_hseparator_new
+       gtk_icon_factory_add
        gtk_icon_factory_add_default
        gtk_icon_factory_get_type
        gtk_icon_factory_lookup
@@ -1041,10 +1042,10 @@ EXPORTS
        gtk_pixmap_new
        gtk_pixmap_set
        gtk_pixmap_set_build_insensitive
-;      gtk_plug_construct
-;      gtk_plug_get_id
-;      gtk_plug_get_type
-;      gtk_plug_new
+       gtk_plug_construct
+       gtk_plug_get_id
+       gtk_plug_get_type
+       gtk_plug_new
        gtk_preview_draw_row
        gtk_preview_get_cmap
        gtk_preview_get_info
@@ -1219,11 +1220,11 @@ EXPORTS
        gtk_size_group_new
        gtk_size_group_remove_widget
        gtk_size_group_set_mode
-;      gtk_socket_add_id
-;      gtk_socket_get_id
-;      gtk_socket_get_type
-;      gtk_socket_new
-;      gtk_socket_steal
+       gtk_socket_add_id
+       gtk_socket_get_id
+       gtk_socket_get_type
+       gtk_socket_new
+       gtk_socket_steal
        gtk_spin_button_configure
        gtk_spin_button_get_adjustment
        gtk_spin_button_get_digits
@@ -1872,7 +1873,6 @@ EXPORTS
        gtk_widget_get_style
        gtk_widget_get_toplevel
        gtk_widget_get_type
-       gtk_widget_get_usize
        gtk_widget_get_visual
        gtk_widget_grab_default
        gtk_widget_grab_focus
@@ -1932,6 +1932,7 @@ EXPORTS
        gtk_widget_set_style
        gtk_widget_set_uposition
        gtk_widget_set_usize
+       gtk_widget_set_size_request
        gtk_widget_shape_combine_mask
        gtk_widget_show
        gtk_widget_show_all
@@ -1963,8 +1964,10 @@ EXPORTS
        gtk_window_get_has_frame
        gtk_window_get_mnemonic_modifier
        gtk_window_get_modal
+       gtk_window_get_position
        gtk_window_get_resizable
        gtk_window_get_role
+       gtk_window_get_size
        gtk_window_get_title
        gtk_window_get_transient_for
        gtk_window_get_type
@@ -1977,11 +1980,15 @@ EXPORTS
        gtk_window_list_toplevels
        gtk_window_maximize
        gtk_window_mnemonic_activate
+       gtk_window_move
        gtk_window_new
+       gtk_window_parse_geometry
        gtk_window_present
        gtk_window_remove_accel_group
        gtk_window_remove_embedded_xid
        gtk_window_remove_mnemonic
+       gtk_window_reshow_with_initial_size
+       gtk_window_resize
        gtk_window_set_decorated
        gtk_window_set_default
        gtk_window_set_default_size